Flutter এর বেসিক কাঠামো সম্পর্কে বিস্তারিতভাবে নিচে আলোচনা করা হলো। Flutter অ্যাপ মূলত Widget ভিত্তিক একটি আর্কিটেকচার অনুসরণ করে, যেখানে প্রতিটি UI উপাদান Widget হিসেবে উপস্থাপিত হয়। প্রতিটি অ্যাপের স্ট্রাকচার কিভাবে তৈরি হয় এবং বিভিন্ন অংশ কিভাবে কাজ করে তা বোঝার জন্য Flutter এর বেসিক কাঠামো বোঝা গুরুত্বপূর্ণ।
Flutter এর বেসিক কাঠামো:
১. Flutter অ্যাপের স্ট্রাকচার:
- Flutter অ্যাপের স্ট্রাকচার সাধারণত
main.dartফাইলে থাকে, যা অ্যাপের এন্ট্রি পয়েন্ট হিসেবে কাজ করে। - একটি সাধারণ Flutter অ্যাপের কাঠামো নিচের মত হয়:
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(title: 'Flutter Home Page'),
);
}
}
class MyHomePage extends StatelessWidget {
final String title;
MyHomePage({required this.title});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(title),
),
body: Center(
child: Text('Hello, Flutter!'),
),
);
}
}
২. Flutter অ্যাপের প্রধান উপাদান:
- Widget:
- Flutter অ্যাপের প্রতিটি অংশই Widget হিসেবে উপস্থাপিত হয়। Widget হলো অ্যাপ্লিকেশনের বিল্ডিং ব্লক।
- Widget প্রধানত দুটি ধরনের হতে পারে:
- Stateless Widget: যা স্থির (immutable) থাকে এবং এর স্টেট পরিবর্তন হয় না। এটি সাধারণত একবারই তৈরি হয়।
- Stateful Widget: এটি স্টেটফুল হয় এবং এর স্টেট ডাইনামিক্যালি পরিবর্তন হতে পারে। এটি পুনরায় রেন্ডার হতে পারে, যখন তার স্টেট পরিবর্তন হয়।
- MaterialApp:
MaterialAppহলো একটি রুট Widget যা পুরো অ্যাপকে Material Design গাইডলাইন অনুসরণ করে তৈরি করতে সাহায্য করে।- এটি সাধারণত থিম, রাউট, এবং অন্যান্য প্রপার্টি ধারণ করে এবং অ্যাপের মূল স্ট্রাকচার হিসেবে কাজ করে।
- Scaffold:
Scaffoldহলো Material Design এর প্রাথমিক স্ট্রাকচার প্রদানকারী Widget, যা অ্যাপের AppBar, Drawer, Bottom Navigation Bar, এবং Body এর মত বিভিন্ন UI উপাদান ধারণ করে।
- AppBar:
AppBarহলো একটি টপ বারের মতো Widget যা অ্যাপের শিরোনাম, অ্যাকশন বাটন, এবং অন্যান্য তথ্য প্রদর্শন করে।
- Body:
Bodyহলো অ্যাপের প্রধান কন্টেন্ট এলাকা যেখানে মূল UI উপাদান থাকে। এটি সাধারণতCenter,Column,Row, বাContainerএর মতো Widget ধারণ করে।
- Center Widget:
CenterWidget একটি কন্টেন্টকে স্ক্রিনের মাঝখানে অবস্থান করাতে সাহায্য করে। এটি সাধারণত টেক্সট, ইমেজ, বা অন্যান্য Widget ধারণ করে।
৩. Flutter অ্যাপের Widget ট্রি:
Flutter অ্যাপে প্রতিটি Widget একটি Widget ট্রি গঠন করে, যা Flutter এর অ্যাপ্লিকেশনের কাঠামো তৈরিতে ব্যবহৃত হয়। Widget ট্রি অনুযায়ী, প্রতিটি Widget এর একটি প্যারেন্ট এবং চাইল্ড Widget থাকে।
- উদাহরণস্বরূপ:
MaterialAppমূল রুট Widget হিসেবে কাজ করে এবং তার চাইল্ড হিসেবেScaffoldথাকে।Scaffoldএর চাইল্ড হিসেবেAppBarএবংBodyথাকে।Bodyএর চাইল্ড হিসেবেCenterএবংCenterএর চাইল্ড হিসেবেTextথাকে।
৪. Flutter অ্যাপের লাইফ সাইকেল:
- Flutter অ্যাপের লাইফ সাইকেল Stateless এবং Stateful Widget এর উপর নির্ভর করে। Stateless Widget এর লাইফ সাইকেল সরল, কারণ এটি একবারই তৈরি হয় এবং পরিবর্তন হয় না।
- Stateful Widget এর লাইফ সাইকেল বেশি ডাইনামিক:
- createState(): যখন একটি Stateful Widget তৈরি হয়, এটি প্রথমে
createState()কল করে। - initState():
createState()এর পরinitState()কল হয়, যা উইজেটটি ইনিশিয়ালাইজ করে। - build():
initState()এর পরbuild()কল হয়, যা UI রেন্ডার করে। - setState(): যখন স্টেট পরিবর্তন হয়, তখন
setState()কল করেbuild()পুনরায় রেন্ডার হয়।
- createState(): যখন একটি Stateful Widget তৈরি হয়, এটি প্রথমে
৫. Flutter এর থিম এবং স্টাইলিং:
- Flutter অ্যাপে থিম এবং স্টাইলিং করতে
ThemeDataব্যবহার করা হয়, যাMaterialAppএর প্রপার্টি হিসেবে সেট করা হয়। উদাহরণস্বরূপ:
MaterialApp(
theme: ThemeData(
primarySwatch: Colors.blue,
textTheme: TextTheme(
bodyText1: TextStyle(color: Colors.black),
),
),
);
Flutter এর বেসিক কাঠামো সংক্ষেপে:
- Flutter অ্যাপ একটি Widget ট্রি আর্কিটেকচার অনুসরণ করে, যেখানে প্রতিটি UI উপাদান একটি Widget।
- অ্যাপের প্রধান উপাদানগুলো হলো MaterialApp, Scaffold, AppBar, এবং Stateless ও Stateful Widget।
- Stateless Widget স্থির, আর Stateful Widget পরিবর্তনশীল স্টেট ধারণ করতে পারে।
- Widget ট্রি এবং Widget লাইফ সাইকেল অনুসরণ করে Flutter অ্যাপ তৈরি হয়।
এই বেসিক কাঠামো বুঝে Flutter ডেভেলপাররা সহজেই বিভিন্ন ধরনের UI এবং অ্যাপ্লিকেশন তৈরি করতে পারেন।
Flutter অ্যাপ্লিকেশনের গঠন সাধারণত বেশ সংগঠিত এবং মডুলার হয়। Flutter-এ একটি অ্যাপ্লিকেশন তৈরি করতে প্রজেক্টের বিভিন্ন ফাইল এবং ডিরেক্টরি একটি নির্দিষ্ট কাঠামোতে থাকে, যা অ্যাপ্লিকেশনটির কার্যক্রম এবং রক্ষণাবেক্ষণ সহজ করে। Flutter অ্যাপ্লিকেশনের গঠন সম্পর্কে বিস্তারিত নিচে দেওয়া হলো:
Flutter অ্যাপ্লিকেশনের স্ট্যান্ডার্ড গঠন
Flutter অ্যাপ্লিকেশন তৈরির পর সাধারণত নিচের গঠনটি দেখা যায়:
my_app/
├── android/
├── ios/
├── lib/
│ ├── main.dart
├── test/
├── web/
├── build/
├── pubspec.yaml
├── pubspec.lock
├── README.md
└── .gitignore
ডিরেক্টরি এবং ফাইলের বিস্তারিত:
android/ এবং ios/:
- এই ডিরেক্টরিগুলো Android এবং iOS এর জন্য নেটিভ কনফিগারেশন ফাইল এবং সোর্স কোড সংরক্ষণ করে। এখানে Android এর জন্য
Gradleএবং iOS এর জন্যXcodeকনফিগারেশন থাকে। - যদি আপনি Flutter দিয়ে Android বা iOS অ্যাপ তৈরি করেন, তবে এই ফোল্ডারগুলো প্রয়োজনীয় বিল্ড এবং কনফিগারেশন পরিবর্তন করার জন্য ব্যবহৃত হয়।
lib/:
- এই ডিরেক্টরিটি হল আপনার অ্যাপ্লিকেশনের মূল কোডবেস। এখানে সমস্ত Dart ফাইল থাকে, এবং অ্যাপ্লিকেশনের লগিক, UI, এবং অন্যান্য ফাংশনালিটি নির্ধারণ করা হয়।
- main.dart ফাইলটি হলো অ্যাপ্লিকেশনের এন্ট্রি পয়েন্ট। এখানে
main()ফাংশন থাকে, যা অ্যাপ্লিকেশন চালু করে।
test/:
- এখানে আপনার অ্যাপ্লিকেশনের টেস্ট ফাইল থাকে। Flutter-এ টেস্টিং অনেক গুরুত্বপূর্ণ, এবং এই ফোল্ডারটি ব্যবহার করে ডেভেলপাররা তাদের অ্যাপের বিভিন্ন ইউনিট এবং উইজেট টেস্ট করতে পারে।
- Dart এর flutter_test প্যাকেজ ব্যবহার করে এখানে টেস্ট লেখা হয়।
web/:
- এই ডিরেক্টরিটি Flutter এর ওয়েব অ্যাপ্লিকেশন ডেভেলপমেন্টের জন্য ব্যবহৃত হয়। এখানে ওয়েব সংক্রান্ত কনফিগারেশন এবং ফাইল থাকে, যেমন
index.html। - এটি Flutter ওয়েব অ্যাপ্লিকেশন রেন্ডারিং এবং কনফিগারেশনের জন্য গুরুত্বপূর্ণ।
build/:
- এই ডিরেক্টরিটি Flutter অ্যাপ্লিকেশন বিল্ড করার পর তৈরি হয় এবং বিল্ড ফাইল সংরক্ষণ করে। এটি অ্যাপের APK, IPA, বা ওয়েব ফাইল রাখার জন্য ব্যবহৃত হয়।
- এই ফোল্ডারটি সাধারণত স্বয়ংক্রিয়ভাবে তৈরি এবং আপডেট হয়।
pubspec.yaml:
- এই ফাইলটি Flutter প্রজেক্টের একটি গুরুত্বপূর্ণ কনফিগারেশন ফাইল। এখানে প্রজেক্টের ডিপেন্ডেন্সি, অ্যাসেটস, প্যাকেজ, এবং অন্যান্য কনফিগারেশন উল্লেখ করা হয়।
- উদাহরণ:
- এখানে ডিপেন্ডেন্সি যোগ করা, অ্যাসেট ফাইল যোগ করা এবং অন্যান্য সেটিংস করা হয়।
name: my_app
description: A new Flutter project
version: 1.0.0+1
environment:
sdk: ">=2.12.0 <3.0.0"
dependencies:
flutter:
sdk: flutter
cupertino_icons: ^1.0.2
dev_dependencies:
flutter_test:
sdk: flutter
flutter:
uses-material-design: true
assets:
- assets/images/
pubspec.lock:
- এটি
pubspec.yamlএর ওপর ভিত্তি করে তৈরি হয় এবং নির্দিষ্ট ডিপেন্ডেন্সিগুলোর ভার্সন সংরক্ষণ করে। যখন আপনিflutter pub getচালান, এটি ডিপেন্ডেন্সি আপডেট করে এবং সেই অনুযায়ী লক ফাইল আপডেট করে।
README.md:
- এটি প্রজেক্টের বিবরণ, ব্যবহার নির্দেশিকা, এবং অন্যান্য তথ্য রাখার জন্য ব্যবহৃত হয়। সাধারণত এটি প্রজেক্টের শুরুতে ডেভেলপার বা ব্যবহারকারীদের জন্য গাইড হিসেবে কাজ করে।
.gitignore:
- এই ফাইলটি গিটের মাধ্যমে কোন কোন ফাইল বা ডিরেক্টরি ভার্সন কন্ট্রোলে অন্তর্ভুক্ত হবে না তা নির্ধারণ করে। সাধারণত বিল্ড ফোল্ডার এবং কনফিগারেশন ফাইলগুলো
.gitignoreএ উল্লেখ করা হয়।
Flutter অ্যাপ্লিকেশনের মূল ফাইল: main.dart
lib/main.dart ফাইলটি Flutter অ্যাপ্লিকেশনের এন্ট্রি পয়েন্ট, যা প্রথম চালানো হয়। এই ফাইলটি Flutter এর উইজেট ট্রি তৈরি করে এবং অ্যাপ্লিকেশনটির স্ট্রাকচার এবং ডিজাইন সংজ্ঞায়িত করে।
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: Scaffold(
appBar: AppBar(
title: Text('Flutter Home Page'),
),
body: Center(
child: Text('Hello, Flutter!'),
),
),
);
}
}
Flutter অ্যাপ্লিকেশনের গঠনের বৈশিষ্ট্য
- মডুলার স্ট্রাকচার: Flutter প্রজেক্টটি মডুলার হয় এবং বিভিন্ন কোডকে সহজেই বিভিন্ন ফোল্ডারে বিভক্ত করা যায়, যেমন models, views, controllers ইত্যাদি।
- মাল্টি-প্ল্যাটফর্ম সাপোর্ট: Android, iOS, web, এবং desktop এর জন্য আলাদা আলাদা কনফিগারেশন এবং ডিরেক্টরি আছে।
- সহজ কনফিগারেশন:
pubspec.yamlএর মাধ্যমে খুব সহজেই অ্যাপের ডিপেন্ডেন্সি এবং অ্যাসেট ম্যানেজ করা যায়।
Flutter অ্যাপ্লিকেশনের এই স্ট্রাকচার ডেভেলপারদের জন্য কোড সংগঠিত করা, রক্ষণাবেক্ষণ, এবং নতুন ফিচার যোগ করা সহজ করে তোলে।
Flutter এ Widget Tree এবং Widget গঠন নিয়ে বিস্তারিত আলোচনা নিচে করা হলো। Flutter অ্যাপ্লিকেশনের মূল ভিত্তি হলো Widget, এবং Widget Tree দ্বারা অ্যাপের UI কাঠামো তৈরি করা হয়। প্রতিটি Widget একে অপরের সাথে সম্পর্কিত হয়ে একটি ট্রি (গাছের) আকারে সংগঠিত হয়, যাকে Widget Tree বলা হয়। এটি Flutter এর UI রেন্ডারিং এবং বিল্ড প্রসেসে গুরুত্বপূর্ণ ভূমিকা পালন করে।
Widget Tree কী?
- Widget Tree হলো একটি গঠন, যেখানে প্রতিটি UI উপাদান বা Widget একটি ট্রি স্ট্রাকচারে অবস্থান করে। Flutter এ প্রতিটি Widget এর একটি প্যারেন্ট Widget এবং এক বা একাধিক চাইল্ড Widget থাকতে পারে।
- Widget Tree সাধারণত একটি Root Widget দিয়ে শুরু হয়, যা অ্যাপ্লিকেশনের মূল কাঠামো গঠন করে এবং এর ভেতরে অন্যান্য Widget থাকে।
Widget Tree এর উদাহরণ:
Flutter এ একটি সাধারণ Widget Tree এর উদাহরণ নিচে দেওয়া হলো:
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Flutter Widget Tree'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text('Hello, World!'),
ElevatedButton(
onPressed: () {},
child: Text('Press Me'),
),
],
),
),
),
);
}
}
এই উদাহরণে Widget Tree এর গঠন কেমন তা নিচে ব্যাখ্যা করা হলো:
- MyApp: এই Widget হলো অ্যাপ্লিকেশনের Root Widget। এটি একটি StatelessWidget এবং এটি
MaterialAppWidget কে রিটার্ন করে। - MaterialApp: এটি একটি প্রধান Wrapper Widget যা অ্যাপের থিম, রাউটিং এবং অন্যান্য সেটিংস ধারণ করে। এটি মূলত Android এবং iOS এর Material Design অনুযায়ী UI প্রদান করে।
- Scaffold:
MaterialAppএর মধ্যেScaffoldWidget রয়েছে, যা অ্যাপ্লিকেশনের প্রাথমিক কাঠামো তৈরি করে। এটি অ্যাপের AppBar, Drawer, Body ইত্যাদি ধারণ করতে ব্যবহৃত হয়। - AppBar:
Scaffoldএর একটি উপাদান, যা টপে একটি টাইটেল বা অ্যাকশন বাটন প্রদর্শন করে। - Center: এটি একটি Widget যা তার চাইল্ডকে স্ক্রিনের মাঝখানে অবস্থান করায়।
- Column:
Centerএর চাইল্ড হিসেবে একটিColumnWidget ব্যবহার করা হয়েছে, যা লম্বালম্বিভাবে একাধিক Widget ধারণ করে। - Text এবং ElevatedButton:
Columnএর চাইল্ড হিসেবেTextএবংElevatedButtonWidget গুলো রাখা হয়েছে, যা একসাথে একটি UI উপাদান তৈরি করেছে।
Widget গঠন (Structure of Widgets):
Flutter এ প্রতিটি UI উপাদান একটি Widget হিসেবে উপস্থাপিত হয়। Widgets সাধারণত দুই ধরনের হয়:
- StatelessWidget: এটি একটি Stateless (অপরিবর্তনীয়) Widget, যার স্টেট পরিবর্তন হয় না। এটি সাধারণত স্থির UI উপাদান তৈরি করতে ব্যবহৃত হয়।
- StatefulWidget: এটি একটি Stateful (পরিবর্তনশীল) Widget, যার স্টেট পরিবর্তন হতে পারে। এটি ডাইনামিক UI উপাদান তৈরি করতে ব্যবহৃত হয়, যেখানে ইউজারের ইন্টারঅ্যাকশন বা অ্যাপ্লিকেশনের পরিবর্তনের উপর ভিত্তি করে UI পরিবর্তিত হয়।
StatelessWidget এর উদাহরণ:
class MyStatelessWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Text('I am a Stateless Widget');
}
}
- এই Widget এর স্টেট একবার তৈরি হলে তা আর পরিবর্তন হয় না।
StatefulWidget এর উদাহরণ:
class MyStatefulWidget extends StatefulWidget {
@override
_MyStatefulWidgetState createState() => _MyStatefulWidgetState();
}
class _MyStatefulWidgetState extends State<MyStatefulWidget> {
int _counter = 0;
void _incrementCounter() {
setState(() {
_counter++;
});
}
@override
Widget build(BuildContext context) {
return Column(
children: [
Text('Counter: $_counter'),
ElevatedButton(
onPressed: _incrementCounter,
child: Text('Increment'),
),
],
);
}
}
- এই Widget এ
_counterনামক একটি স্টেট রয়েছে, যা ইউজারের ক্লিকের মাধ্যমে পরিবর্তিত হয়।setState()মেথডের মাধ্যমে Flutter জানানো হয় যে, স্টেট পরিবর্তিত হয়েছে এবং UI পুনরায় রেন্ডার করা হবে।
Widget Tree এবং Build Process:
- Flutter এ প্রতিটি Widget
build()মেথড ব্যবহার করে UI তৈরি করে। যখন কোনো Widget এর স্টেট পরিবর্তন হয়, তখনbuild()মেথড পুনরায় কল হয়ে Widget Tree আপডেট করে। - Widget Tree অ্যাপ্লিকেশনের UI কাঠামোকে নির্ধারণ করে এবং প্রতিটি Widget এর সম্পর্ক এবং তাদের মধ্যে কিভাবে ইন্টারঅ্যাকশন হবে তা ঠিক করে।
Widget Tree এর গুরুত্বপূর্ণ বৈশিষ্ট্য:
- Parent-Child Relationship: প্রতিটি Widget Tree এ Parent-Child সম্পর্ক থাকে, যেখানে একটি Widget এর চাইল্ড অন্য Widget হয়।
- Composition-Based Architecture: Flutter এ Widgets কম্পোজিশন আর্কিটেকচারের ওপর ভিত্তি করে কাজ করে। আপনি ছোট ছোট Widgets একত্রিত করে বড় এবং জটিল Widgets তৈরি করতে পারেন।
- Reusability: Flutter এ Widgets রিইউজেবল, যার মানে একটি Widget বিভিন্ন স্থানে পুনরায় ব্যবহার করা যায়। এটি কোডের পুনঃব্যবহারযোগ্যতা বাড়ায়।
- Immutable Stateless Widgets:
StatelessWidgetগুলো Immutable, যার মানে তারা একবার তৈরি হলে পরিবর্তিত হয় না। - Dynamic Stateful Widgets:
StatefulWidgetগুলো Dynamic, যার মানে তাদের স্টেট পরিবর্তন হতে পারে এবং UI অনুযায়ী রিফ্রেশ হয়।
Flutter এর Widget গঠন সংক্ষেপে:
- Widget Tree: Flutter এ প্রতিটি UI উপাদান একটি Widget হিসেবে গঠিত হয় এবং এটি একটি ট্রি স্ট্রাকচারে সংগঠিত থাকে।
- StatelessWidget: পরিবর্তনহীন এবং স্থির UI তৈরি করতে ব্যবহৃত হয়।
- StatefulWidget: পরিবর্তনশীল এবং ডাইনামিক UI উপাদান তৈরি করতে ব্যবহৃত হয়, যেখানে ইউজারের ইন্টারঅ্যাকশন বা অ্যাপ্লিকেশনের আপডেট অনুসারে স্টেট পরিবর্তিত হয়।
Flutter এ Widget Tree এবং Widget গঠনের ধারণা বুঝে, আপনি উন্নত এবং কার্যকর UI তৈরি করতে পারবেন।
Flutter এ Stateless Widget এবং Stateful Widget হলো দুটি প্রধান Widget টাইপ, যেগুলোর মধ্যে পার্থক্য মূলত স্টেট পরিচালনার উপরে ভিত্তি করে। Flutter অ্যাপে UI তৈরি করতে এই Widget গুলো ব্যবহৃত হয়। নিচে Stateless এবং Stateful Widget এর মধ্যে পার্থক্য এবং এদের বৈশিষ্ট্য আলোচনা করা হলো:
Stateless Widget:
- সংজ্ঞা: Stateless Widget হলো এমন একটি Widget, যেটি কোনো পরিবর্তনশীল স্টেট ধারণ করে না। এটি একবারই তৈরি হয় এবং এর UI স্থির (immutable) থাকে।
- বৈশিষ্ট্য:
- এটি কোনো ডাইনামিক ডেটা বা স্টেট ম্যানেজ করে না।
- একবার
build()মেথড কল হলে, এর ভিউ অপরিবর্তিত থাকে যতক্ষণ না পর্যন্ত Widget ট্রীতে কোনো আপডেট হয়। - সাধারণত নির্দিষ্ট বা ফিক্সড UI উপাদান তৈরি করতে ব্যবহৃত হয়।
- কোড উদাহরণ:
- উপরে দেয়া কোডে, MyStatelessWidget একটি Stateless Widget, যা স্ক্রিনে একটি স্থির টেক্সট প্রদর্শন করে।
import 'package:flutter/material.dart';
class MyStatelessWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Stateless Widget Example'),
),
body: Center(
child: Text('This is a Stateless Widget'),
),
);
}
}
Stateful Widget:
- সংজ্ঞা: Stateful Widget হলো এমন একটি Widget, যেটি পরিবর্তনশীল স্টেট ধারণ করে এবং যখনই এর স্টেট পরিবর্তিত হয়, তখন এটি পুনরায় রেন্ডার হয়।
- বৈশিষ্ট্য:
- এটি ডাইনামিক ডেটা বা স্টেট ম্যানেজ করতে পারে এবং স্টেট পরিবর্তনের উপর ভিত্তি করে UI আপডেট করে।
StatefulWidgetদুটি অংশে বিভক্ত:StatefulWidgetক্লাস এবং এর সাথে সম্পর্কিতStateক্লাস।setState()মেথড ব্যবহার করে Widget এর স্টেট পরিবর্তন করা যায় এবং নতুন স্টেট অনুযায়ী UI আপডেট হয়।
- কোড উদাহরণ:
- উপরে দেয়া কোডে, MyStatefulWidget একটি Stateful Widget, যা একটি কাউন্টার ধারণ করে। যখন বাটন চাপা হয়, তখন
_incrementCounterমেথড কল হয়, এবংsetState()মেথড ব্যবহার করে_counterমান বৃদ্ধি করে। এর ফলে, UI পুনরায় রেন্ডার হয় এবং আপডেটেড মান দেখানো হয়।
- উপরে দেয়া কোডে, MyStatefulWidget একটি Stateful Widget, যা একটি কাউন্টার ধারণ করে। যখন বাটন চাপা হয়, তখন
import 'package:flutter/material.dart';
class MyStatefulWidget extends StatefulWidget {
@override
_MyStatefulWidgetState createState() => _MyStatefulWidgetState();
}
class _MyStatefulWidgetState extends State<MyStatefulWidget> {
int _counter = 0;
void _incrementCounter() {
setState(() {
_counter++;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Stateful Widget Example'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'Button pressed this many times:',
),
Text(
'$_counter',
style: Theme.of(context).textTheme.headline4,
),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: _incrementCounter,
tooltip: 'Increment',
child: Icon(Icons.add),
),
);
}
}
Stateless এবং Stateful Widget এর মধ্যে পার্থক্য:
| বৈশিষ্ট্য | Stateless Widget | Stateful Widget |
|---|---|---|
| স্টেট ম্যানেজমেন্ট | স্টেট ম্যানেজ করে না, স্থির থাকে | পরিবর্তনশীল স্টেট ধারণ করতে পারে এবং আপডেট হয় |
| বিল্ড মেথড | একবার build() কল হয়ে স্থির UI তৈরি করে | স্টেট পরিবর্তনের সময় build() পুনরায় কল হয় |
| ব্যবহার | ফিক্সড UI উপাদান যেমন টেক্সট, ইমেজ, বাটন | ডাইনামিক UI উপাদান যেমন কন্ট্রোল, ইনপুট ফিল্ড |
| প্রয়োজনীয়তা | যদি UI পরিবর্তন না হয়, তখন Stateless Widget যথেষ্ট | যদি UI ডাইনামিক বা স্টেট-নির্ভর হয়, Stateful Widget প্রয়োজনীয় |
কখন Stateless এবং Stateful Widget ব্যবহার করবেন:
- Stateless Widget: যখন UI কন্টেন্ট স্থির থাকে এবং এর কোনো পরিবর্তন নেই, তখন Stateless Widget ব্যবহার করা হয়। উদাহরণস্বরূপ, যদি আপনি একটি নির্দিষ্ট টেক্সট বা ইমেজ প্রদর্শন করতে চান যা পরিবর্তিত হবে না।
- Stateful Widget: যখন UI ডাইনামিক বা পরিবর্তনশীল তথ্যের উপর ভিত্তি করে তৈরি হয়, তখন Stateful Widget ব্যবহার করা হয়। উদাহরণস্বরূপ, যদি আপনি একটি ফর্ম বা কাউন্টার তৈরি করতে চান যা ব্যবহারকারীর ইন্টারেকশন অনুযায়ী পরিবর্তিত হয়।
এই পার্থক্যগুলো বুঝে Flutter ডেভেলপাররা কোন পরিস্থিতিতে কোন Widget ব্যবহার করবেন তা নির্ধারণ করতে পারেন।
Flutter-এ MaterialApp এবং CupertinoApp হলো দুটি ভিন্ন ধরনের অ্যাপ্লিকেশন উইজেট, যা Flutter অ্যাপ্লিকেশনের জন্য প্ল্যাটফর্ম-নির্ভর UI ডিজাইন করতে ব্যবহৃত হয়। MaterialApp মূলত Android এবং Material Design এর জন্য ব্যবহৃত হয়, যেখানে CupertinoApp iOS এর জন্য Cupertino স্টাইল ব্যবহার করে। নিচে এই দুটি উইজেটের বিস্তারিত ব্যবহার এবং পার্থক্য আলোচনা করা হলো।
1. MaterialApp
MaterialApp উইজেটটি Flutter এর Material Design থিম এবং উইজেটগুলির জন্য ব্যবহৃত হয়। এটি Android অ্যাপ্লিকেশনের জন্য উপযুক্ত এবং Google এর Material Design নির্দেশিকা অনুসরণ করে।
MaterialApp এর বৈশিষ্ট্য
- Material Design সাপোর্ট: MaterialApp-এ Flutter এর Material Design এর সমস্ত কম্পোনেন্ট (যেমন AppBar, FloatingActionButton, Drawer, BottomNavigationBar) ব্যবহার করা যায়।
- থিমিং সাপোর্ট: অ্যাপ্লিকেশনের জন্য কাস্টম থিম সেট করতে পারবেন (যেমন প্রাইমারি কালার, অ্যাকসেন্ট কালার, টেক্সট স্টাইল ইত্যাদি)।
- নেভিগেশন এবং রুটিং: MaterialApp-এ নেভিগেশন এবং রুটিং সহজে ম্যানেজ করা যায়।
- আন্তর্জাতিককরণ (i18n): MaterialApp আন্তর্জাতিককরণ এবং লোকালাইজেশনের জন্য ইন-বিল্ট সাপোর্ট প্রদান করে।
MaterialApp এর উদাহরণ
import 'package:flutter/material.dart';
void main() {
runApp(MyMaterialApp());
}
class MyMaterialApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Material App Example',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: Scaffold(
appBar: AppBar(
title: Text('Home Page'),
),
body: Center(
child: Text('Hello, MaterialApp!'),
),
floatingActionButton: FloatingActionButton(
onPressed: () {},
child: Icon(Icons.add),
),
),
);
}
}
MaterialApp এর গুরুত্বপূর্ণ প্রপার্টি
- title: অ্যাপ্লিকেশনের শিরোনাম নির্ধারণ করে।
- theme: অ্যাপ্লিকেশনের থিম সেট করতে ব্যবহৃত হয়।
- home: অ্যাপ্লিকেশনের প্রাথমিক (প্রথম) স্ক্রিন বা পৃষ্ঠা।
- routes: অ্যাপ্লিকেশনের বিভিন্ন রুট বা পেজের মেপিং সংরক্ষণ করে, যা নেভিগেশনের জন্য ব্যবহৃত হয়।
- initialRoute: অ্যাপ্লিকেশনের প্রথমে কোন রুট দেখানো হবে তা নির্ধারণ করে।
- locale: অ্যাপ্লিকেশনের ভাষা সেট করে।
2. CupertinoApp
CupertinoApp উইজেটটি iOS এর জন্য Cupertino ডিজাইন নির্দেশিকা অনুসরণ করে। এটি iOS-স্টাইলের অ্যাপ্লিকেশন তৈরি করতে ব্যবহৃত হয় এবং Apple এর ডিজাইন ফিলোসফি অনুসরণ করে।
CupertinoApp এর বৈশিষ্ট্য
- Cupertino ডিজাইন সাপোর্ট: CupertinoApp-এ Flutter এর Cupertino উইজেট (যেমন CupertinoNavigationBar, CupertinoButton, CupertinoTabBar) ব্যবহার করা যায়।
- iOS থিম: এটি iOS এর জন্য স্টাইল করা থিম এবং উইজেট প্রদান করে, যা ব্যবহারকারীদের জন্য iOS-সদৃশ অভিজ্ঞতা তৈরি করে।
- নেভিগেশন এবং রুটিং: MaterialApp এর মতো CupertinoApp-এও নেভিগেশন এবং রুটিং ম্যানেজ করা যায়।
- অ্যানিমেশন: iOS-স্টাইল অ্যানিমেশন এবং ট্রানজিশন সাপোর্ট করে, যা iOS এর সাথে সামঞ্জস্যপূর্ণ।
CupertinoApp এর উদাহরণ
import 'package:flutter/cupertino.dart';
void main() {
runApp(MyCupertinoApp());
}
class MyCupertinoApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return CupertinoApp(
title: 'Cupertino App Example',
home: CupertinoPageScaffold(
navigationBar: CupertinoNavigationBar(
middle: Text('Home Page'),
),
child: Center(
child: Text('Hello, CupertinoApp!'),
),
),
);
}
}
CupertinoApp এর গুরুত্বপূর্ণ প্রপার্টি
- title: অ্যাপ্লিকেশনের শিরোনাম নির্ধারণ করে।
- theme: iOS-স্টাইল থিম সেট করতে ব্যবহৃত হয় (যদিও এটি MaterialApp এর মতো থিমিং সাপোর্ট দেয় না)।
- home: প্রাথমিক স্ক্রিন বা পৃষ্ঠা, যা CupertinoPageScaffold বা অন্য Cupertino উইজেটের মাধ্যমে ডিফাইন করা হয়।
- routes: বিভিন্ন পৃষ্ঠার মেপিং সংরক্ষণ করে, নেভিগেশনের জন্য ব্যবহৃত হয়।
- locale: অ্যাপ্লিকেশনের ভাষা এবং লোকাল সেটিংস নির্ধারণ করে।
MaterialApp এবং CupertinoApp এর পার্থক্য
| বৈশিষ্ট্য | MaterialApp | CupertinoApp |
|---|---|---|
| ডিজাইন | Material Design (Android-স্টাইল) | Cupertino Design (iOS-স্টাইল) |
| উইজেটস | Material উইজেটস (AppBar, Button ইত্যাদি) | Cupertino উইজেটস (NavigationBar, Button ইত্যাদি) |
| থিমিং | Material থিমিং সাপোর্ট | সীমিত থিমিং সাপোর্ট, প্রধানত iOS স্টাইল |
| নেভিগেশন এবং রুটিং | নেভিগেশন এবং রুটিং সাপোর্ট | নেভিগেশন এবং রুটিং সাপোর্ট |
| অ্যানিমেশন | Material অ্যানিমেশন | iOS-স্টাইল অ্যানিমেশন সাপোর্ট |
| আন্তর্জাতিককরণ | সহজেই আন্তর্জাতিককরণ (i18n) সাপোর্ট করে | আন্তর্জাতিককরণ (i18n) সাপোর্ট করে |
কোনটি বেছে নেবেন?
- যদি আপনি Android বা Material Design অ্যাপ্লিকেশন তৈরি করতে চান, তবে MaterialApp ব্যবহার করা উচিত।
- যদি আপনি iOS-এর জন্য বিশেষ করে অ্যাপ্লিকেশন তৈরি করতে চান, তবে CupertinoApp বেছে নেওয়া উচিত।
আশা করি, MaterialApp এবং CupertinoApp সম্পর্কে এই আলোচনা আপনাকে Flutter অ্যাপ্লিকেশনের জন্য সঠিক উইজেট বেছে নিতে সাহায্য করবে।
Read more